
package servidor.impl;

import beans.Estudiant;
import beans.ParticipacioEnquesta;
import beans.PreguntaEnquesta;
import beans.TotalsPregunta;
import common.EOlympicsException;
import common.RemotInterface;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;
import servidor.bbdd.*;

/**
 * Classe que implementa l'interfície RemotInterface
 * @author Juan Luís Chávez Lobato i Jesús Hernàndez Garcia
 */
public class RemotImpl extends UnicastRemoteObject 
                           implements RemotInterface, Serializable    
{
    
    private static final long serialVersionUID = 1L;
    private GestorDiscConnexio gestorBD;

    /**
     * Constructor de la clase<br>
     * Crea una conexió a la Base de Dades
     * @exception RemoteException
     * @exception EOlympicsException
     */    
    public RemotImpl() throws RemoteException, EOlympicsException {
        super();
        gestorBD = new GestorDiscConnexio();
        gestorBD.obreConnexioBD();
    }

    /**
     * @see RemotInterface#getEstudiant(java.lang.String) 
     */     
    @Override
    public Estudiant getEstudiant(String loginEstudiant) throws RemoteException, EOlympicsException {
        GestorEstudiants gestorEstudiants = 
                new GestorEstudiants(gestorBD);
        
        return gestorEstudiants.obtenirEstudiant(loginEstudiant);                    
    }
    
    /**
     * @see RemotInterface#getNomUniversitat(java.lang.Integer) 
     */     
    @Override
    public String getNomUniversitat(int idUni) throws RemoteException, EOlympicsException {
        GestorUniversitats gestorUniversitats = 
                new GestorUniversitats(gestorBD);

        return gestorUniversitats.obtenirNomUniversitat(idUni);
    }    
    
    /**
     * @see RemotInterface#haFetElQuestionari(java.lang.String) 
     */         
    @Override
    public boolean haFetElQuestionari(String loginEstudiant) throws RemoteException, EOlympicsException {
        GestorParticipacionsEnquestes gestorParticipacionsEnquestes = 
                new GestorParticipacionsEnquestes(gestorBD);
        
        List<ParticipacioEnquesta> participacio = 
                gestorParticipacionsEnquestes.
                    obtenirParticipacioEstudiant(loginEstudiant);
        
        return !participacio.isEmpty();
    }

    /**
     * @see RemotInterface#getPreguntesEnquesta() 
     */         
    @Override
    public List<PreguntaEnquesta> getPreguntesEnquesta() throws RemoteException, EOlympicsException {        
        GestorPreguntesEnquestes gestorPreguntesEnquestes = 
                new GestorPreguntesEnquestes(gestorBD);
        
        return gestorPreguntesEnquestes.obtenirPreguntesEnquestes();
    }

    /**
     * @see RemotInterface#guardarRespostesEnquesta(java.util.List) 
     */         
    @Override
    public boolean guardarRespostesEnquesta(List<ParticipacioEnquesta> respostes) throws RemoteException, EOlympicsException {
        GestorParticipacionsEnquestes gestorParticipacionsEnquestes = 
                new GestorParticipacionsEnquestes(gestorBD);
        
        GestorPreguntesEnquestes gestorPreguntesEnquestes = 
                new GestorPreguntesEnquestes(gestorBD);
        
        boolean guardarOK = false;
        for(ParticipacioEnquesta resposta:respostes){
           
            //Recuperem estudiant i validem que existeix
            Estudiant est = getEstudiant(resposta.getLoginEst());
            if (null==est) throw new EOlympicsException(EOlympicsException.ERR_RECUPERAR_ESTUDIANT);
            
            //Recuperem pregunta i validem que existeix
            PreguntaEnquesta pre = gestorPreguntesEnquestes.
                    obtenirPregunta(resposta.getNumPreg());
            if (null==pre) throw new EOlympicsException(EOlympicsException.ERR_RECUPERAR_PREGUNTES);
            
            //Inserim la resposta
            guardarOK = gestorParticipacionsEnquestes.
                    inserirParticipacio(est, pre, resposta.getValoracio());
            
        }
        return guardarOK;
    }
    
    /**
     * @see RemotInterface#getResultatsTotals(java.lang.String, boolean, int) 
     */         
    @Override
    public List<TotalsPregunta> getResultatsTotals(String login, 
            boolean filteredByUniversitat)
            throws RemoteException, EOlympicsException
    {
        GestorParticipacionsEnquestes gestorParticipacionsEnquestes = 
                new GestorParticipacionsEnquestes(gestorBD);

        //Recuperem estudiant i validem que existeix
        Estudiant est = getEstudiant(login);
        if (null!=est){
            return gestorParticipacionsEnquestes.
                obtenirTotals(login, filteredByUniversitat, est.getIdUni()); 
        }else{
            throw new EOlympicsException(EOlympicsException.ERR_RECUPERAR_ESTUDIANT);
        }
    }
    
    
}
